// 给你一个由一些多米诺骨牌组成的列表 dominoes。

// 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌，我们就认为这两张牌是等价的。
// 形式上，dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a==c 且 b==d，或是 a==d 且 b==c。

// 在 0 <= i < j < dominoes.length 的前提下，找出满足 dominoes[i] 和 dominoes[j] 等价的骨牌对 (i, j) 的数量。

// 暴露接口
const numEquivDominoPairs = function (dominoes: number[][]): number {
    let count = 0;
    const hashMap = new Map<number[], number>();
    hashMap.set(dominoes[0], 0);// 初始化首位元素
    for (let i = 1; i < dominoes.length; i++) {
        let isEqual = false;// 判断是否等价
        // 在哈希表中找是否出现过重复
        for (let [preDomino, currCount] of hashMap.entries()) {
            // 找到后需要累加计数变量然后直接跳出循环
            if (numEquivDominoPairs_check(preDomino, dominoes[i])) {
                currCount++;
                isEqual = true;
                count += currCount;
                hashMap.set(preDomino, currCount);
                break;
            }
        }
        if (!isEqual) hashMap.set(dominoes[i], 0);// 仅仅在不相等时谨慎的添加哈希表

    }
    return count;
};

// 辅助判断方法
function numEquivDominoPairs_check(dominoeA: number[], dominoeB: number[]): boolean {
    return (dominoeA[0] === dominoeB[0] && dominoeA[1] === dominoeB[1]) ||
        (dominoeA[0] === dominoeB[1] && dominoeA[1] === dominoeB[0]);
}

numEquivDominoPairs(
    [
        [1, 2],
        [2, 1],
        [3, 4],
        [5, 6]
    ])